首页 > 试题广场 >

从中序与后序遍历序列构造二叉树

[编程题]从中序与后序遍历序列构造二叉树
  • 热度指数:5529 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉树的中序与后序遍历结果,请你根据两个序列构造符合这两个序列的二叉树。

数据范围:二叉树的节点数满足 ,节点上的值满足 ,保证节点的值各不相同

例如输入[2,1,4,3,5],[2,4,5,3,1]时,
根据中序遍历的结果[2,1,4,3,5]和后序遍历的结果[2,4,5,3,1]可构造出二叉树{1,2,3,#,#,4,5},如下图所示:

示例1

输入

[1],[1]

输出

{1}
示例2

输入

[2,1,4,3,5],[2,4,5,3,1]

输出

{1,2,3,#,#,4,5}

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#

# @param inorder int整型一维数组 中序遍历序列
# @param postorder int整型一维数组 后序遍历序列
# @return TreeNode类
#
class Solution:
    def buildTree(self , inorder: List[int], postorder: List[int]) -> TreeNode:
        # write code here
        n = len(postorder)
        m = len(inorder)
        # 要求中序和后续都不能为空
        if m == 0 or n == 0:
            return None
        # 先找到根节点
        root = TreeNode(postorder[-1])
        for i in range(len(inorder)):
            # 找到中序遍历的第一个根节点
            if inorder[i] == postorder[-1]:
                # 左子树的后续遍历
                leftpos = postorder[:i]
                # 左子树的中序遍历
                leftvin = inorder[:i]
                # 重构左子树
                root.left = self.buildTree(leftvin, leftpos)
                # 右子树的后续遍历
                rightpos = postorder[i:-1]
                # 右子树的中序遍历
                rightvin = inorder[i+1:]
                # 重构右子树
                root.right = self.buildTree(rightvin, rightpos)
                break
        return root
发表于 2022-06-10 19:33:27 回复(0)
class Solution:
    def buildTree(self , inorder: List[int], postorder: List[int]) -> TreeNode:
        # write code here
        if postorder:
            ind=inorder.index(postorder[-1])
            root=TreeNode(postorder.pop())
            root.left=self.buildTree(inorder[:ind],postorder[:ind])#左都同
            root.right=self.buildTree(inorder[ind+1:],postorder[ind:])
            return root

发表于 2022-01-22 07:13:42 回复(0)